﻿#ifndef QHID_USB_H
#define QHID_USB_H

#define cEnable     1
#define cDisable    0
#define cLibModel   cDisable

#include <QMainWindow>
#include <qdebug.h>

#include <iostream>
#include <sstream>
#include <string>
#include <QObject>

#include <QSplitter>
#include <QBoxLayout>

#include <QIcon>
#include <QTimer>
#include <QTime>
#include <QDate>
#include <QToolBar>
#include <QLabel>
#include <QDockWidget>
#include <QTextBrowser>
#include <QLineEdit>
#include <QComboBox>
#include <QPushButton>
#include <QPlainTextEdit>
#include <QSpinBox>
#include <QCheckBox>
#include <QTreeView>
#include <QTableView>
#include <QStandardItemModel>
#include <QItemSelectionModel>
#include <QMessageBox>
#include <QFileDialog>
#include <QDesktopServices>
#include <QtSql>
#include <QFile>
#include <QValidator>
#include <QRegularExpressionValidator>
#include <QProgressBar>

#if cLibModel == cEnable
#include "PB_Box-HidUSB-Lib_global.h"
#endif

//@STUDY:如果使用QRegExp 且在QT6下运行则需要使用QtCore5Compat这个头文件
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
#include <QtWidgets>
#elif (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
#include <QtCore5Compat>
#endif

#define cDefalutMSN 0
#define cSplitMSN   1
#define cSendModel  cSplitMSN

//@NOTE:程序所需宏
#define cDevInfoZerofillCount   4
#define cSizeRXBuff             1024

//@NOTE:16进制自动间隔模式
#define cManualSpece    0
#define cTwoSpace       1
#define cFourSpace      2
#define cSpaceUnit      2

//@NOTE:Report发送模式
#define cSetReport  0
#define cGetReport  1

//@NOTE:Report发送模式
#define cASCIIModel 0
#define cHexModel   1

//@NOTE:文本显示上限
#define cTextBrowser    1000000

//@NOTE:导入hidapi头文件
extern "C"{
    #include "./lib/hidapi/hidapi.h"
}

QT_BEGIN_NAMESPACE
namespace Ui { class qHID_USB; }
QT_END_NAMESPACE

using namespace std;


//@FUNC:用于自定义工具栏的类
class qHIDUSB_ToolBar : public QToolBar
{
    //@STUDY:如果你在类中需要自定义信号与槽必须要使用Q_OBJECT宏！
    Q_OBJECT
public:
    qHIDUSB_ToolBar();

private:

};



//@FUNC:自定义TabWidget
class qHIDUSB_TabWidget : public QTabWidget
{
    Q_OBJECT
public:
    qHIDUSB_TabWidget();
private:

protected:

};



//@FUNC:用于对接HIDAPI的类
class c_HID_USB
{
public:
    //@VARIABLE
    string                          **aDevInfoList_StringP              = nullptr;          //@VARIABLE:用于存储HID设备信息的二维Str数组 //@NOTE:使用QList<QStringList>后二维String指针已经没有存在的意义了，但是此处仍然保留是为了自己以后参考二维指针的用法与实现
    QString                         *aHIDInfoHead_QStrP                 = nullptr;          //@VARIABLE:设备信息头数组
    struct hid_device_info          *aHidInfo_HIDAPIP                   = nullptr;          //@VARIABLE:用于存储最初从HIDAPI便利中拿到的HID设备信息的结构体指针的变量
    struct hid_device_info          *aHidInfoArray_HIDAPI               = nullptr;          //@VARIABLE:此处虽然是指针变量但是和上面的指针变量有一点区别，上方的指针是一次性的，而此处的指针实际上是一个指向用于存储所有HID设备信息hid_device_info数组的指针，即你可以理解为这就是一个用于记录所有HID设备信息的hid_device_info数组
    QList<QStringList>              aOrderlyHIDInfo_QList_QStringList;                      //@VARIABLE:用于存储完成排序的HID设备信息的QStringList容器
    int                             aDevTotal_Int;                                          //@Variable:当前已经连接的usb设备数量
    int                             aEffectiveDevPCS_Int;                                   //@VARIABLE:PID/VID相同的设备的数量
    //@VARIABLE
    hid_device                      *aOpenedDev_hid_device_Write        = nullptr;          //@VARIABLE:用于存储打开的HIDDev(【主线程】写进程专用)
    //hid_device                      *aOpenedDev_hid_device_Read         = nullptr;          //@VARIABLE:用于存储打开的HIDDev(【子线程】读进程专用)
    int                             aSendMsDelay_Int                    = 15;               //@VARIABLE:HID API发送函数延迟变量


    enum cDevInfoIndex{
        cDevInfoIndex_PID = 0,
        cDevInfoIndex_VID,
        cDevInfoIndex_PATH,
        cDevInfoIndex_Manufacturer,
        cDevInfoIndex_SN,
        cDevInfoIndex_RN,
        cDevInfoIndex_Product,
        cDevInfoIndex_Interface,
        cDevInfoIndex_Usage,
        cDevInfoIndex_UsagePage
    };


    //@FUNC:函数区
    c_HID_USB(int xSendMsDelay_Int);
    int  sHIDDevPCSCheck();                                                                 //@FUNC:设备数量扫描函数
    void sHID_Scan();                                                                       //@FUNC:设备扫描函数
    void sSetSendMSNMsDelay(int xSendMsDelay_Int);                                          //@FUNC:修改消息发送延迟的函数

private:
    void sDevInfoList_New_Init();                                                           //@FUNC:根据设备数量开辟对应数量的空间用于储存设备信息
    void sDevInfoList_Delete_Init();                                                        //@FUNC:重新扫描设备时删除之前开辟出来的用于存储设备信息的空间
};



//@FUNC:用于接收打开的HID设备的信息的多线程类
class qHIDRXThread : public QThread
{
    Q_OBJECT
public:
    qHIDRXThread(QString xDevPath_QStr, int xReceiveCycle_Int);                             //@FUNC:读取线程构造函数
    void sReadStop();                                                                       //@FUNC:消息接收停止函数
    void sAdjustReceiveCycle(int xNewCycle_Int);                                            //@FUNC:外界用于调节接收线程接收频率的函数

private:
    QString                         aDevPath_QStr                       = "";               //@VARIABLE:准备监听的HID设备的路径信息
    hid_device                      *aReadDev_hid_device                = nullptr;          //@VARIABLE:用于存储数据读取设备的变量
    bool                            aReadStart_Bool                     = true;             //@VARIABLE:用于控制消息读取线程的变量
    int                             aReceiveCycle_Int                   = 1;                //@VARIABLE:用于控制接收线程接收扫描频率的变量

protected:
    virtual void run() Q_DECL_OVERRIDE;                                                     //@FUNC:多线程消息读取函数

private slots:

signals:
    void sGetMSN_Signal(QString xMSN_QStr);                                                 //@FUNC:用于从子线程将数据转发到主线程的信号

};



//@FUNC:用于接收打开的HID设备的信息的多线程类
class qHIDTXThread : public QThread
{
    Q_OBJECT
public:
    enum cOpenResult
    {
        cOpenOK = 0,
        cOpenFail,
        cWait
    };

    int                             aOpenedResult_Int                   = cWait;            //@VARIABLE:设备打开结果

    qHIDTXThread(QString xDevPath_QStr);                                                    //@FUNC:发送线程构造函数
    void sWriteStop();                                                                      //@FUNC:消息发送停止函数
    bool sMSNSend(QString xSendMSN_QStr, int xMSNModel_Int);                                //@FUNC:消息发送函数

private:
    QString                         aDevPath_QStr                       = "";               //@VARIABLE:准备监听的HID设备的路径信息
    QByteArray                      aSendMSN_QByteArray                 = "";               //@VARIABLE:存储发送消息的变量
    hid_device                      *aWriteDev_hid_device               = nullptr;          //@VARIABLE:用于存储数据发送设备的变量
    bool                            aWriteStart_Bool                    = true;             //@VARIABLE:用于控制消息发送线程的变量
    bool                            aWriteOver_Bool                     = true;             //@VARIABLE:写入完成标志位
    int                             aResult_Int                         = 0;                //@VARIABLE:写入结果
    int                             aInputCnt_Int                       = 0;                //@VARIABLE:输入字符数量

protected:
    virtual void run() Q_DECL_OVERRIDE;                                                     //@FUNC:多线程消息发送函数

private slots:

signals:
    void sSendMSNResult_Signal(int xResult_Int);                                            //@FUNC:发送结果返回函数

};



//@FUNC:用于使用GetReport和SetReport的类
class qHIDSendReportThread : public QThread
{
    Q_OBJECT
public:
    enum cOpenResult
    {
        cOpenOK = 0,
        cOpenFail,
        cWait
    };

    int                             aOpenedResult_Int                   = cWait;            //@VARIABLE:设备打开结果

    qHIDSendReportThread(QString xDevPath_QStr);                                              //@FUNC:Report线程构造函数
    void sWriteStop();                                                                      //@FUNC:消息发送停止函数
    bool sReportSend(QByteArray xSendMSN_QByteArray, int xReportModel_Int);                 //@FUNC:报告发送函数

private:
    QString                         aDevPath_QStr                       = "";               //@VARIABLE:准备监听的HID设备的路径信息
    QByteArray                      aSendReport_QByteArray              = "";               //@VARIABLE:存储发送报告的变量
    hid_device                      *aWriteDev_hid_device               = nullptr;          //@VARIABLE:用于存储数据发送设备的变量
    bool                            aWriteStart_Bool                    = true;             //@VARIABLE:用于控制消息发送线程的变量
    bool                            aWriteOver_Bool                     = true;             //@VARIABLE:写入完成标志位
    int                             aResult_Int                         = 0;                //@VARIABLE:写入结果
    int                             aReportModel_Int                    = 0;                //@VARIABLE:报告发送模式

protected:
    virtual void run() Q_DECL_OVERRIDE;                                                     //@FUNC:多线程消息发送函数

private slots:

signals:
    void sSendReportResult_Signal(int xResult_Int);                                         //@FUNC:发送结果返回函数
    void sGetReport_Signal(QString xMSN_QStr);                                              //@FUNC:用于从子线程将数据转发到主线程的信号

};



//@FUNC:程序UI类
#if cLibModel == cEnable
class PB_BOXHIDUSBLIB_EXPORT qHID_USB : public QMainWindow
#else
class qHID_USB : public QMainWindow
#endif
{
    Q_OBJECT

public:
    qHID_USB(QWidget *parent = nullptr);
    ~qHID_USB();

    enum cTableIndex
    {
        cSendMSNTable = 0,
        cDevSelectTable,
        cAddCareDevTable,
        cCaredDevTable
    };

private:
    //@VARIABLE:程序控制标志位
    bool                            aScanfHIDDev_Bool                   = false;            //@VARIABLE:用于手动扫描设备的变量
    bool                            aDisplayMSNIndex_Bool               = false;            //@VARIABLE:用于控制接收消息显示的标志位
    bool                            aDevCheck_Bool                      = false;            //@VARIABLE:用于控制设备存在检测扫描的标志位
    bool                            aInitOver_Bool                      = false;            //@VARIABLE:初始化完成标志位
    //@VARIABLE:程序主要布局控件
    QSplitter                       *aVSplitter_QSplitter               = nullptr;          //@VARIABLE:用于装填TabWidget和DockWidget的控件
    //@VARIABLE:状态栏控件
    QLabel                          *aDisplayDevTotal_QLabel            = nullptr;          //@VARIABLE:用于显示设备总数量的状态栏Label
    QLabel                          *aEffectiveDevTotal_QLabel          = nullptr;          //@VARIABLE:用于显示有效（PID、VID不同的）设备总数量的状态栏Label
    int                             aSendOkSize_Int                     = 0;                //@VARIABLE:统计发送信息的字节数的变量
    int                             aSendNGSize_Int                     = 0;                //@VARIABLE:统计发送失败的信息的字节数的变量
    QLabel                          *aSendOkSize_QLabel                 = nullptr;          //@VARIABLE:显示发送成功的信息的字节数的控件
    QLabel                          *aSendNGSize_QLabel                 = nullptr;          //@VARIABLE:显示发送失败信息的字节数的控件
    QLabel                          *aAutoSavePath_QLabel               = nullptr;          //@VARIABLE:自动保存路径显示
    //@VARIABLE:数据处理类变量
    int                             aSendFailCnt_Int                    = 0;                //@VARIABLE:发送失败次数统计
    QTimer                          *aAUTOScanHIDDev_QTimer             = nullptr;          //@VARIABLE:用于定时更新HID设备信息的定时器
    QTimer                          *aWriteThreadWatchDog_QTimer        = nullptr;          //@VARIABLE:数据发送线程的看门狗
    QTimer                          *aReportTXThreadWatchDog_QTimer     = nullptr;          //@VARIABLE:报告发送线程看门狗
    c_HID_USB                       *aHIDUSB_c_HID_USB                  = nullptr;          //@VARIABLE:HIDUSB信息获取对象
    qHIDTXThread                    *aWriteThread_qHIDTXThread          = nullptr;          //@VARIABLE:数据发送线程对象
    qHIDRXThread                    *aReadThread_qHIDRXThread           = nullptr;          //@VARIABLE:数据接收线程对象
    qHIDSendReportThread            *aTXReport_qHIDSendReportThread     = nullptr;          //@VARIABLE:报告发送线程对象
    QString                         aOpenedDevPath_QStr                 = "";               //@VARIABLE:正被打开的设备路径
    QString                         aCurOpendDevInfo_QStr               = "";               //@VARIABLE:正被打开的设备的信息
    QString                         aDateAndTimeInfo_QStr               = "";               //@VARIABLE:时间日期戳
    QString                         aAutoSaveDateAndTime_QStr           = "";               //@VARIABLE:数据自动保存专用时间日期戳
    QString                         aMSNBuffer_QStr                     = "";               //@VARIABLE:消息接收缓冲区
    QString                         aReportBuffer_QStr                  = "";               //@VARIABLE:消息接收缓冲区
    QString                         aAutoSavePath_QStr                  = "";               //@VARIABLE:数据自动保存路径
    QFile                           *aDataAutoSave_QFile                = nullptr;          //@VARIABLE:用于自动存储通信数据的文件
    QFile                           *aParamSaveFile_QFile               = nullptr;          //@VARIABLE:用于保存设置变量的文件
    //@VARIABLE:用于区分存储收藏设备和普通设备的容器
    QList<QStringList>              aCaredDev_QList_QStrList;
    QList<QStringList>              aGeneraldDev_QList_QStrList;
    QList<QStringList>              aTotalDev_QList_QStrList;
    //@VARIABLE:工具栏控件
    qHIDUSB_ToolBar                 *aToolBar_qHIDUSB_ToolBar           = nullptr;          //@VARIABLE:用于常用工具栏
    qHIDUSB_ToolBar                 *aOperationBar_qHIDUSB_ToolBar      = nullptr;          //@VARIABLE:用于放置HID设备操作工具的工具栏
    QWidget                         *aDevOperation_QWidget              = nullptr;          //@VARIABLE:用于装填设备操作相关控件的Widget
    QPushButton                     *aOpenDev_QPushButton               = nullptr;          //@VARIABLE:用于打开当前所选设备的按钮
    QPushButton                     *aCloseDev_QPushButton              = nullptr;          //@VARIABLE:用于关闭当前所选设备的按钮
    QPushButton                     *aScanDev_QPushButton               = nullptr;          //@VARIABLE:用于手动刷新当前连接设备的按钮
    QComboBox                       *aDevSelect_QComboBox               = nullptr;          //@VARIABLE:用于选择HID设备的ComboBox
    //@VARIABLE:TabWidget相关控件
    qHIDUSB_TabWidget               *aTabWidget_qHIDUSB_TabWidget       = nullptr;          //@VARIABLE:自定义TabWidget
    QWidget                         *aDevInfoDisplay_QWidget            = nullptr;          //@VARIABLE:TabWidget中用于显示当前设备详细信息的页面
    QTextBrowser                    *aDevInfoDisplay_QTextBrowser       = nullptr;          //@VARIABLE:Dev信息显示窗口
    //@VARIABLE:DockWidget控件（放弃使用DockWidget，控件交由aDockWidget_QWidget）
    QList<int>                      aChildCnt_QList_Int;                                    //@VARIABLE:用于记录相同PIDVID设备数量的容器
    QWidget                         *aDockWidget_QWidget                = nullptr;          //@VARIABLE:DockWidget所包含的Widget
    QTreeView                       *aDevList_QTreeView                 = nullptr;          //@VARIABLE:以树状图的形式显示当前连接的所有设备
    QStandardItemModel              *aDevInfo_QStandardItemModel        = nullptr;          //@VARIABLE:用于显示设备及其信息的标准数据模型
    QItemSelectionModel             *aCurrentItem_QItemSelectionModel   = nullptr;          //@VARIABLE:用于显示当前所选对象的数据模型
    //@VARIABLE:设备备注收藏页
    QWidget                         *aDevEdit_QWidget                   = nullptr;          //@VARIABLE:设备备注收藏页
    QTableView                      *aDevEdit_QTableView                = nullptr;          //@VARIABLE:设备备注收藏编辑View
    QStandardItemModel              *aDevInfoTable_QStandardItemModel   = nullptr;          //@VARIABLE:用于收藏设备的表格数据模型
    QItemSelectionModel             *aTableCurItem_QItemSelectionModel  = nullptr;          //@VARIABLE:收藏设备表格当前所选对象
    //@VARIABLE:收藏设备显示页
    QWidget                         *aDisplayCare_QWidget               = nullptr;          //@VARIABLE:设备备注收藏页
    QTableView                      *aDisplayCare_QTableView            = nullptr;          //@VARIABLE:设备备注收藏编辑View
    QSqlDatabase                    aCareDevDB_QSqlDatabase;                                //@VARIABLE:用于存储收藏、备注过的设备的信息的数据库
    QSqlRelationalTableModel        *aCareDev_QSqlRelationalTableModel  = nullptr;          //@VARIABLE:用于和数据库交互的数据表模型
    QItemSelectionModel             *aCurCareDev_QItemSelectionModel    = nullptr;          //@VARIABLE:收藏、备注表当前所选对象
    //@VARIABLE:消息发送组件
    QWidget                         *aCommunication_QWidget             = nullptr;          //@VARIABLE:通信页面
    QWidget                         *aSendModule_QWidget                = nullptr;          //@VARIABLE:发送控件
    QTextBrowser                    *aMSNDisplay_QTextBrowser           = nullptr;          //@VARIABLE:消息记录显示框
    QCheckBox                       *aDisplayWithHex_QCheckBox          = nullptr;          //@VARIABLE:消息显示为16进制
    QPushButton                     *aSendMSN0_QPushButton              = nullptr;          //@VARIABLE:发送按钮0
    QPushButton                     *aSendMSN1_QPushButton              = nullptr;          //@VARIABLE:发送按钮1
    QPushButton                     *aSendMSN2_QPushButton              = nullptr;          //@VARIABLE:发送按钮2
    QCheckBox                       *aAutoSend0_QCheckBox               = nullptr;          //@VARIABLE:自动发送复选框0
    QCheckBox                       *aAutoSend1_QCheckBox               = nullptr;          //@VARIABLE:自动发送复选框1
    QCheckBox                       *aAutoSend2_QCheckBox               = nullptr;          //@VARIABLE:自动发送复选框2
    QSpinBox                        *aAutoSend0_QSpinBox                = nullptr;          //@VARIABLE:自动发送周期设置框0
    QSpinBox                        *aAutoSend1_QSpinBox                = nullptr;          //@VARIABLE:自动发送周期设置框1
    QSpinBox                        *aAutoSend2_QSpinBox                = nullptr;          //@VARIABLE:自动发送周期设置框2
    QPlainTextEdit                  *aMSNEdit0_QPlainTextEdit           = nullptr;          //@VARIABLE:消息编辑框0
    QPlainTextEdit                  *aMSNEdit1_QPlainTextEdit           = nullptr;          //@VARIABLE:消息编辑框1
    QPlainTextEdit                  *aMSNEdit2_QPlainTextEdit           = nullptr;          //@VARIABLE:消息编辑框2
    QCheckBox                       *aHexModel0_QCheckBox               = nullptr;          //@VARIABLE:16进制模式开关0
    QCheckBox                       *aHexModel1_QCheckBox               = nullptr;          //@VARIABLE:16进制模式开关1
    QCheckBox                       *aHexModel2_QCheckBox               = nullptr;          //@VARIABLE:16进制模式开关2
    QComboBox                       *aHexInputModel0_QComboBox          = nullptr;          //@VARIABLE:用于选择16进制输入模式的ComboBox0
    QComboBox                       *aHexInputModel1_QComboBox          = nullptr;          //@VARIABLE:用于选择16进制输入模式的ComboBox1
    QComboBox                       *aHexInputModel2_QComboBox          = nullptr;          //@VARIABLE:用于选择16进制输入模式的ComboBox2
    QTimer                          *aAUTOSendMSN0_QTimer               = nullptr;          //@VARIABLE:用于定时发送信息到设备的定时器
    QTimer                          *aAUTOSendMSN1_QTimer               = nullptr;          //@VARIABLE:用于定时发送信息到设备的定时器
    QTimer                          *aAUTOSendMSN2_QTimer               = nullptr;          //@VARIABLE:用于定时发送信息到设备的定时器
    //@VARIABLE:控制传输组件
    QWidget                         *aReportModule_QWidget              = nullptr;          //@VARIABLE:存放收发特征报告控件的QWidget
    QPushButton                     *aReportSend_QPushButton            = nullptr;          //@VARIABLE:Report发送按钮
    QCheckBox                       *aAutoSendReport_QCheckBox          = nullptr;          //@VARIABLE:自动发送SetReport复选框
    QSpinBox                        *aAutoSetReport_QSpinBox            = nullptr;          //@VARIABLE:自动发送SetReport周期设置框
    QComboBox                       *aSelectReportModel_QComboBox       = nullptr;          //@VARIABLE:用于选择Report发送模式的ComboBox
    QComboBox                       *aSetReportAutoAddSpace_QComboBox   = nullptr;          //@VARIABLE:用于16进制输入模式下选择自动添加空格逻辑的选择器
    QLineEdit                       *aReportEdit_QLineEdit              = nullptr;          //@VARIABLE:SetReport编辑框
    QTimer                          *aAUTOSetReport_QTimer              = nullptr;          //@VARIABLE:用于定时发送SetReport到设备的定时器
    //@VARIABLE:清空缓冲区进度条
    QWidget                         *aAutoClearDisplay_QWidget          = nullptr;          //@VARIABLE:自动清空相关控件所在的QWidget
    QLabel                          *aAutoClearTextCnt_QLabel           = nullptr;          //@VARIABLE:自动清空倒计时
    QProgressBar                    *aAutoClearTextCnt_QProgressBar     = nullptr;          //@VARIABLE:用于显示自动清空显示区进度的进度条
    //@VARIABLE:扫描、收、发相关参数设置控件
    QWidget                         *aCycleSet_QWidget                  = nullptr;          //@VARIABLE:频率设置页面
    QLabel                          *aReceiveCycle_QLabel               = nullptr;          //@VARIABLE:消息接收周期调整框标题栏
    QLabel                          *aAutoScanfCycle_QLabel             = nullptr;          //@VARIABLE:自动扫描设备频率设置标题栏
    QSpinBox                        *aReceiveCycle_QSPinBox             = nullptr;          //@VARIABLE:消息接收周期调整框
    QSpinBox                        *aAutoScanfCycle_QSpinBox           = nullptr;          //@VARIABLE:自动扫描设备频率设置
    QLabel                          *aRXMSNDisplayCycle_QLabel          = nullptr;          //@VARIABLE:接收消息显示周期调整框标题栏
    QLabel                          *aDevWriteCycle_QLabel              = nullptr;          //@VARIABLE:HIDAPI发送函数调用强制间隔标题栏
    QSpinBox                        *aRXMSNDisplayCycle_QSPinBox        = nullptr;          //@VARIABLE:接收消息显示周期调整框
    QSpinBox                        *aDevWriteCycle_QSpinBox            = nullptr;          //@VARIABLE:HIDAPI发送函数调用强制间隔调整框
    QTimer                          *aDisplayMSN_QTimer                 = nullptr;          //@VARIABLE:用于定时显示接收消息频率的定时器


    Ui::qHID_USB *ui;
    void UI_Init();                                                                         //@FUNC:Ui初始化函数
    void Signal_Init();                                                                     //@FUNC:信号与槽初始化函数
    void sParam_Init();                                                                     //@FUNC:设置参数初始化函数
    void sSqlite_Init();                                                                    //@FUNC:数据库初始化函数
    void sViewAndModel_Init();                                                              //@FUNC:TreeView以及DevEdit的表头和列宽初始化设置
    int  sQueryItemForSqlModel(QString xPath);                                              //@FUNC:用于查询传入路径信息的设备是否有被收藏
    void sSendMSN(QString xMSN_QStr, int xSendBtnIndex_Int, int xReportID_Int, int xInputModel_Int);//@FUNC:消息发送函数
    void sRefreshDateAndTime();                                                             //@FUNC:用于刷新日期时间戳的函数
    void sStartSaveWithOpenDev();                                                           //@FUNC:在打开设备的同时开启自动保存功能
    void sStopSaveWithCloseDev();                                                           //@FUNC:在关闭设备的同时关闭自动保存功能
    void sDataAutoSave(QString xData_QStr);                                                 //@FUNC:数据自动保存函数
    void sParamAutoSave();                                                                  //@FUNC:程序参数自动保存函数
    bool sDirCheck(QString xDirPath_QStr, QString xDirName_QStr);                           //@FUNC:文件夹存在检测函数
    void sUiDelayMsec(unsigned int xMsec_UNInt);                                            //@FUNC:创建子事件循环,在子事件循环中,父事件循环仍然是可以执行的,该方法不会阻塞线程
    void sSendReport(QString xReport_QStr, int xSendReportModel_Int);                       //@FUNC:报告发送函数
    QString sInputHexAutoSpace(QString xNewInput, int xSpaceModel);                         //@FUNC:输入16进制自动添加间隔的函数
    QString sInputToHex(QString xInput_QStr);                                               //@FUNC:用于将输入强制转换为16进制字符的函数

protected:
    virtual void closeEvent(QCloseEvent *event) Q_DECL_OVERRIDE;                            //@FUNC:重写关闭事件函数

private slots:
    void sHIDInfoUpdate_Slot();                                                             //@FUNC:用于更新HID设备数量及信息的槽函数
    void sOn_CurrentDevChanged_Slot(int xCurrentIndex_Int);                                 //@FUNC:当前所选设备发生变化时变更显示信息的槽函数
    void sOn_TreeSelectChanged_Slot(QModelIndex xCurSelect,QModelIndex xPreSelect);         //@FUNC:当前TreeView所选设备发生变化时变更ComboBox所选设备的槽函数
    void sOn_TabWidgetChanged_Slot(int xNewIndex);                                          //@FUNC:当前所选TabWidget发生变化时用于改变界面的槽函数
    void sOn_DevEditCurChanged_Slot(QModelIndex xCurSelect,QModelIndex xPreSelect);         //@FUNC:设备收藏设置页所选列发生变动
    bool sOn_OpenBtnClicked_Slot(bool xClicked);                                            //@FUNC:打开按钮被点击
    void sOn_CloseBtnClicked_Slot(bool xClicked);                                           //@FUNC:关闭按钮被点击
    void sOn_ScanfBtnClicked_Slot(bool xClicked);                                           //@FUNC:扫描按钮被点击
    void sOn_ReadNewMsn_Slot(QString xMSN);                                                 //@FUNC:接收到新的信息
    void sOn_ReadNewReport_Slot(QString xReport);                                           //@FUNC:接收到新的信息

    void sOn_SendBtn0Clicked_Slot();                                                        //@FUNC:发送按钮0被点击
    void sOn_SendBtn1Clicked_Slot();                                                        //@FUNC:发送按钮1被点击
    void sOn_SendBtn2Clicked_Slot();                                                        //@FUNC:发送按钮2被点击
    void sOn_OnHexInput0Clicked_Slot(bool xClicked_Bool);                                   //@FUNC:16进制输入复选框0被勾选
    void sOn_OnHexInput1Clicked_Slot(bool xClicked_Bool);                                   //@FUNC:16进制输入复选框1被勾选
    void sOn_OnHexInput2Clicked_Slot(bool xClicked_Bool);                                   //@FUNC:16进制输入复选框2被勾选
    void sOn_OnMSNEdit0Changed_Slot();                                                      //@FUNC:当消息输入框0文本变化时
    void sOn_OnMSNEdit1Changed_Slot();                                                      //@FUNC:当消息输入框1文本变化时
    void sOn_OnMSNEdit2Changed_Slot();                                                      //@FUNC:当消息输入框2文本变化时
    void sOn_OnHexModel0Changed_Slot();                                                     //@FUNC:当16进制自动空格模式变化时0
    void sOn_OnHexModel1Changed_Slot();                                                     //@FUNC:当16进制自动空格模式变化时1
    void sOn_OnHexModel2Changed_Slot();                                                     //@FUNC:当16进制自动空格模式变化时2
    void sOn_AutoSend0CheckedChanged_Slot(bool xChecked);                                   //@FUNC:如果自动发送按钮被打开
    void sOn_AutoSend1CheckedChanged_Slot(bool xChecked);                                   //@FUNC:如果自动发送按钮被打开
    void sOn_AutoSend2CheckedChanged_Slot(bool xChecked);                                   //@FUNC:如果自动发送按钮被打开
    void sOn_TimerSpinBox0ValueChanged_Slot(int xNewValue);                                 //@FUNC:定时器时间变化
    void sOn_TimerSpinBox1ValueChanged_Slot(int xNewValue);                                 //@FUNC:定时器时间变化
    void sOn_TimerSpinBox2ValueChanged_Slot(int xNewValue);                                 //@FUNC:定时器时间变化

    void sOn_ReportEditInput_Slot(QString xNewInput);                                       //@FUNC:当SetReport输入框有输入时
    void sOn_SendReportBtnClicked_Slot();                                                   //@FUNC:SetReport按钮被点击
    void sOn_AutoSendReportCheckedChanged_Slot(bool xChecked);                              //@FUNC:如果自动发送SetReport按钮被打开
    void sOn_SendReportSpinBoxValueChanged_Slot(int xNewValue);                             //@FUNC:SetReport定时器时间变化
    void sOn_OnReportHexModelChanged_Slot(int xHexModel_Int);                               //@FUNC:Report16进制输入框空格模式变化

    void sOn_ReceiveCycleChaged_Slot(int xNewCycle_Int);                                    //@FUNC:消息自动接收频率变动
    void sOn_AutoScanfCycleChaged_Slot(int xNewCycle_Int);                                  //@FUNC:自动扫描频率变动
    void sOn_SendMSNMsDelayChaged_Slot(int xNewSendDelay_Int);                              //@FUNC:发送函数间隔延迟变动
    void sOn_RXTimerSpinBoxValueChanged_Slot(int xNewValue);                                //@FUNC:接收计时器调节器数值变动
    void sOn_RXTimerTimteout_Slot();                                                        //@FUNC:接收计时器超时
    void sOn_WriteThreadWatchDogTimeout_Slot();                                             //@FUNC:看门狗饿死了！
    void sWriteThreadFeedDog_Slot(int xSendResult_Int);                                     //@FUNC:发送线程的看门狗饲料接收函数
    void sReportTXThreadFeedDog_Slot(int xSendResult_Int);                                  //@FUNC:报告发送线程的看门狗饲料接收函数
    void sOn_CaredTableSelectionChanged_Slot(QModelIndex xCurItem,QModelIndex xPreItem);    //@FUNC:用于根据所选项启用禁用操作按钮的槽函数
    void sOn_TextBrowserTextChanged();                                                      //@FUNC:消息显示框文本变化时触发，用于避免文本数量过多

    void on_action_PathSelect_triggered();                                                  //@FUNC:日志文件夹路径选择
    void on_action_LogDir_triggered();                                                      //@FUNC:打开当前日志文件夹
    void on_action_ClearPath_triggered();                                                   //@FUNC:恢复日志储存路径为默认路径
    void on_action_ClearTextBrow_triggered();                                               //@FUNC:清空文本框按钮槽函数
    void on_action_AboutApp_triggered();                                                    //@FUNC:关于本程序的相关信息
    void on_action_QtVersion_triggered();                                                   //@FUNC:Qt版本查询函数
    void on_action_AppendDev_triggered();                                                   //@FUNC:手动添加收藏设备
    void on_action_DeleteDev_triggered();                                                   //@FUNC:删除所选的收藏的设备
    void on_action_SaveCared_triggered();                                                   //@FUNC:保存收藏页的修改
    void on_action_Uodo_triggered();                                                        //@FUNC:撤销未保存的修改
    void on_action_Update_triggered();                                                      //@FUNC:检查更新Action

signals:
    void sMSNAutoReport_Signal(QString xMSN_QStr);                                          //@FUNC:用于转发调试信息到外部的信号

};
#endif // QHID_USB_H
